package com.example.library.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.library.dto.BaseQueryRequest;
import com.example.library.entity.BorrowRecord;

import java.util.List;

/**
 * 借阅记录服务接口
 *
   */
public interface BorrowRecordService extends IService<BorrowRecord> {

    /**
     * 分页查询借阅记录
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<BorrowRecord> getBorrowRecordPage(BaseQueryRequest queryRequest);

    /**
     * 查询用户的借阅记录
     *
     * @param userId 用户ID
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<BorrowRecord> getUserBorrowRecords(Long userId, BaseQueryRequest queryRequest);

    /**
     * 查询图书的借阅记录
     *
     * @param bookId 图书ID
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<BorrowRecord> getBookBorrowRecords(Long bookId, BaseQueryRequest queryRequest);

    /**
     * 查询用户当前借阅的图书
     *
     * @param userId 用户ID
     * @return 当前借阅记录列表
     */
    List<BorrowRecord> getCurrentBorrowedBooks(Long userId);

    /**
     * 查询逾期的借阅记录
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<BorrowRecord> getOverdueRecords(BaseQueryRequest queryRequest);

    /**
     * 查询即将到期的借阅记录
     *
     * @param days 天数
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<BorrowRecord> getDueSoonRecords(Integer days, BaseQueryRequest queryRequest);

    /**
     * 借阅图书
     *
     * @param userId 用户ID
     * @param bookId 图书ID
     * @param borrowDays 借阅天数
     * @return 借阅记录
     */
    BorrowRecord borrowBook(Long userId, Long bookId, Integer borrowDays);

    /**
     * 归还图书
     *
     * @param recordId 借阅记录ID
     * @return 是否成功
     */
    boolean returnBook(Long recordId);

    /**
     * 续借图书
     *
     * @param recordId 借阅记录ID
     * @param extendDays 续借天数
     * @return 是否成功
     */
    boolean renewBook(Long recordId, Integer extendDays);

    /**
     * 检查用户是否已借阅某图书
     *
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 是否已借阅
     */
    boolean hasUserBorrowedBook(Long userId, Long bookId);

    /**
     * 获取用户当前借阅数量
     *
     * @param userId 用户ID
     * @return 借阅数量
     */
    Long getUserCurrentBorrowCount(Long userId);

    /**
     * 获取用户历史借阅数量
     *
     * @param userId 用户ID
     * @return 历史借阅数量
     */
    Long getUserTotalBorrowCount(Long userId);

    /**
     * 获取图书借阅次数
     *
     * @param bookId 图书ID
     * @return 借阅次数
     */
    Long getBookBorrowCount(Long bookId);

    /**
     * 更新逾期状态和罚金
     *
     * @return 更新数量
     */
    int updateOverdueStatus();

    /**
     * 获取借阅统计信息
     *
     * @return 统计信息
     */
    Object getBorrowStatistics();

    /**
     * 获取热门图书统计
     *
     * @param limit 限制数量
     * @return 热门图书列表
     */
    List<Object> getPopularBooksStatistics(Integer limit);

    /**
     * 获取活跃用户统计
     *
     * @param limit 限制数量
     * @return 活跃用户列表
     */
    List<Object> getActiveUsersStatistics(Integer limit);

}